package com.spring.demo4.factory.Joinpoint;

import java.lang.reflect.AccessibleObject;

/**
 * Joinpoint接口：连接点，程序运行的某一个点，连接点表示方法的调用过程，内部包含了方法调用过程中的所有信息，比如被调用的方法、目标、代理对象、执行拦截器链等信息
 * <br>
 * Spring AOP原理: 使用jdk动态代理和cglib代理来创建代理对象，通过代理对象来访问目标对象，而代理对象中融入了增强的代码，最终起到对目标对象增强的效果
 * <br>
 * 最终有2个实现:
 * 1.ReflectiveMethodInvocation: 当代理对象是采用jdk动态代理创建的，通过代理对象来访问目标对象的方法的时，最终过程是由该类来处理的，
 * 内部会通过递归调用方法拦截器，最终会调用到目标方法
 * 2.CglibMethodInvocation: 当代理对象是采用cglib创建的，通过代理对象来访问目标对象的方法的时，最终过程是由该类来处理的，
 * 内部会通过递归调用方法拦截器，最终会调用到目标方法
 *
 * @author vhans
 */
public interface MyJoinPoint {

    /**
     * 转到拦截器链中的下一个拦截器
     */
    Object proceed() throws Throwable;

    /**
     * 返回保存当前连接点静态部分【的对象】，这里一般指被代理的目标对象
     */
    Object getThis();

    /**
     * 返回此静态连接点，一般就为当前的Method(至少目前的唯一实现是MethodInvocation,所以连接点的静态部分肯定就是本方法)
     */
    AccessibleObject getStaticPart();
}
